package com.augurit.common.system.service.org;

import java.util.List;

import org.springside.modules.orm.Page;

import com.augurit.common.base.service.IBaseService;
import com.augurit.common.system.web.org.form.OmGroupForm;
import com.augurit.common.system.web.org.form.OmPositionForm;
import com.augurit.common.system.web.org.form.OmUserForm;

/**
 * 工作组接口
 */
public interface IOmGroupService extends IBaseService<OmGroupForm, Long> {	
	
	/**
	 * 根据工作组ID获取工作组名称
	 * @param id 工作组主键
	 * @return 工作组名称
	 */
	public String getGroupName(Long id);
	
	/**
	 * 获取工作组form对象
	 * @param id
	 * @return
	 */
	public OmGroupForm getForm(Long id);
	
	/**
	 * 添加工作组
	 * @param form 工作组form对象
	 */
	public void addGroupCascade(OmGroupForm form);
	
	/**
	 * 删除工作组
	 * @param groupIds 工作组id数组
	 */
	public void deleteGroupCascade(Long...groupIds);

	/**
	 * 删除组织关联的用户
	 * @param groupId 工作组id
	 * */
	public void disAssociatedUserFromGroup(Long groupId);
	
	/**
	 * 获取顶级工作组form列表
	 * @return 顶级工作组form列表
	 * */
	public List<OmGroupForm> getTopGroups();
	
	/**
	 * 获取所有的工作组的id
	 * @return 工作组id数组
	 */
	public Long[] getAllGroupIds();
	/**
	 * 获取所有的工作组
	 * @return 工作组form对象列表
	 */
	public List<OmGroupForm> getAllGroups();
	
	/**
	 * 获取具有工作组的机构id数组
	 * @author 王剑文
	 * @return
	 */
	public Long[] getOrgIdsOwnedGroup();
	/**
	 * 获取某一个工作组的直属父工作组，顶级工作组的父工作组为null
	 * @param groupId 工作组id
	 * @return 直属工作组id
	 */
	public Long getDirectParentGroup(Long groupId);
	
	/**
	 * 获取某一个工作组的间接父工作组，顶级父工作组的间接父工作组为null
	 * @param groupId 工作组id
	 * @return 间接父工作组id列表
	 */
	public List<Long> getIndirectParentGroup(Long groupId);
	
	/**
	 * 获取某一个工作组的所有父工作组（包括直属父工作组和间接父工作组），顶级父工作组的间接父工作组为null
	 * @param groupId 工作组id
	 * @return 所有父工作组id列表
	 */
	public List<Long> getAllParentGroup(Long groupId);
	
	/**
	 * 获取某一个用户的所有父工作组（包括直属父工作组和间接父工作组）
	 * @param userId 用户id
	 * @return 所有父工作组id列表
	 */
	public List<Long> getAllParentGroupOfUser(Long userId);
	
	/**
	 * 获取一组工作组的直属父机构
	 * @param groupIds 工作组id数组
	 * @return 机构id数组
	 */
	public Long[] getDirectParentOrgIds(Long...groupIds);

	/**
	 * 获取机构下的直属工作组id数组
	 * @param orgId 机构id
	 * @return
	 */
	public Long[] getDirectGroupIdsByOrg(Long orgId);
	/**
	 * 获取机构的直属工作组
	 * @author 王剑文
	 * @param orgId 机构id
	 * @return
	 */
	public List<OmGroupForm> getDirectGroupsByOrg(Long orgId);
	
	/**
	 * 获取工作组的直属工作组
	 * @author 王剑文
	 * @param groupId 工作组id
	 * @return
	 */
	public List<OmGroupForm> getDirectGroupsByGroup(Long groupId);
	
	/**
	 * 获取工作组下的直属工作组分页对象
	 * @param parentGroupId
	 * @param page
	 * @return
	 */
	public Page<OmGroupForm> getDirectGroupsByGroup(Long parentGroupId, Page<OmGroupForm> page);
	
	/**
	 * 获取指定工作组下的岗位
	 * @author 王剑文
	 * @param groupId 工作组id
	 * @return 岗位form列表
	 */
	
	public List<OmPositionForm> getPositions(Long groupId);
	
	/**
	 * 获取指定工作组下的用户
	 * @author 王剑文
	 * @param groupId 工作组id
	 * @return 用户form列表
	 */
	public List<OmUserForm> getUsers(Long groupId);
	
	/**
	 * 获取指定工作组下没有工作组岗位的用户
	 * @param groupId
	 * @return
	 */
	public List<OmUserForm> getUsersNotHavePos(Long groupId);
	
	/**
	 * 获取工作组下的用户id数组
	 * @param groupId 工作组id
	 * @return 用户id数组
	 */
	public Long[] getUserIdsByGroupId(Long groupId);
	
	/**
	 * 根据工作组id数组获取一批工作组（包括工作组的子工作组）下的所有的用户
	 * @param groupIds 工作组id
	 * @return 用户id数组
	 */
	public Long[] getAllUserIdsByGroupIds(Long[] groupIds);
	
	/**
	 * 向工作组中添加用户
	 * @author 王剑文
	 * @param groupId 工作组id
	 * @param userIds 用户id数组
	 */
	public void addUsersToGroup(Long groupId, Long...userIds);
	
	/**
	 * 向工作组岗位中添加用户
	 * @author 王剑文
	 * @param posId
	 * @param groupId 工作组id
	 * @param userIds 用户id数组
	 */
	public void addUsersToGroupPos(Long posId, Long groupId, Long...userIds);
	
}
